/*
Copyright 2011 Mary Suárez Machado

Este programa es de software libre: usted puede redistribuirlo y/o modificarlo según los términos de la Licencia de Gran pública de GNU como publicado por la Fundación de Software Libre, versión 3 de la Licencia, (o en su opción) cualquier versión posterior.

 Este programa es distribuido en la esperanza que será útil, pero SIN CUALQUIER GARANTÍA; sin aún la garantía implícita de VALOR COMERCIAL O SALUD PARA UN OBJETIVO PARTICULAR. Mirar la Licencia de Gran pública de GNU para más detalles.
*/


 /**
 *@file Cadena.cpp
 *@brief Implementaciones de las funciones del módulo Cadena
 *@author Mary Carmen Suarez
 *
 */

#include <iostream>
#include <cassert>
#include <Cadena.h>

using namespace std;

Cadena :: Cadena()
{
	nelem=0;
	reservados=65794;
	perdidos=0;
	fich=0;
}

Cadena :: ~Cadena()
{}

int Cadena :: Size () const
{
	return perdidos+nelem;
}

void Cadena :: RecargarCadena ()
{
	for (int i=0; i< (32768+258); i++)
		cadena[i]=cadena[32768+i];
	nelem=nelem-32768;
	perdidos+=32768;
	char c;
	while (nelem < reservados && fich->get(c))
	{
		cadena[nelem]=c;
		nelem++;
		crc.Paridad_AddByte(c);	
	}
}

unsigned char Cadena :: GetCaracter (int pos)
{
	int posicion=pos-perdidos;
	if (posicion >= 65536)
		RecargarCadena();
	return cadena[posicion];
}

void Cadena :: Leer (istream & is)
{
	fich=&is;
	char c;
	while (nelem < reservados && is.get(c))
	{
		cadena[nelem]=c;
		nelem++;
		crc.Paridad_AddByte(c);	
	}
}

unsigned int Cadena :: GetParidad () const
{
	return crc.Paridad_Get();
}
